import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Queens {

    public static void main(String[] args) {

        List<Integer> data = new ArrayList<Integer>() {
            {
                add(1);
                add(2);
                add(3);
                add(4);
                add(5);
                add(6);
                add(7);
                add(8);
            }
        };
        findAnwser(data, new ArrayList<Integer>());
    }

    public static void findAnwser(List<Integer> source, List<Integer> result) {
        for(int a : source) {
            result.add(a);
            findAnwser(remove(a, source), result);
        }
        if (source.size() == 0) {
            findCompose(result);
        }
        if (result.size() > 0) {
            result.remove(result.size() - 1);
        }
    }

    private static void findCompose(List<Integer> compise) {
        if (checkH(compise)) {
            if (checkV(compise)) {
                 System.out.println(compise);
            }
        }
    }

    private static boolean checkV(List<Integer> compise) {
        ArrayList<Integer> integers = new ArrayList<Integer>();
        for (int i = 1; i <= 8; i++) {
            integers.add(compise.get(i-1) - i);
        }
        return checkDuplicate(integers);
    }

    private static boolean checkH(List<Integer> compise) {
        ArrayList<Integer> integers = new ArrayList<Integer>();
        for (int i = 1; i <= 8; i++) {
            integers.add(compise.get(i-1) + i);
        }
        return checkDuplicate(integers);
    }

    private static boolean checkDuplicate(ArrayList<Integer> integers) {
        Set<Integer> set = new TreeSet<Integer>();
        set.addAll(integers);
        return integers.size() == set.size();
    }

    public static List<Integer> remove(int a, List<Integer> source) {
        ArrayList<Integer> integers = new ArrayList<Integer>();
        for(int x : source) {
            if (x == a) continue;
            integers.add(x);
        }
        return integers;
    }

}
